home *** CD-ROM | disk | FTP | other *** search
- unit first;
- {$I+ will raise IO-exceptions when needed }
- interface
- uses
- WinTypes, WinProcs, SysUtils, Classes;
-
- Const
- BlockLine = 16;
- BlockChar = 16;
- BlockSize = BlockLine * BlockChar; { 16 x 16 = 256 }
-
- Type
- TBlock = Array[1..BlockSize] of Byte;
-
- TBFile = class(TComponent)
- private
- { Private declarations }
- FFileName: TFileName;
- FFile: File;
- FOffset: LongInt; { 0, 256, 512, ... }
- FBlock: TBlock; { data from FFile }
- FSize: Cardinal; { actual size of data in FBlock <= BlockSize }
-
- protected
- { Protected declarations }
- procedure SetFileName(AFileName: TFileName); virtual;
- procedure SetOffset(AnOffset: LongInt); virtual;
-
- public
- { Public declarations }
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
-
- published
- { Published declarations }
- property FileName: TFileName read FFileName write SetFileName;
- property Offset: LongInt read FOffset write SetOffset default 0;
- end {TBFile};
-
- procedure Register;
-
- implementation
-
- constructor TBFile.Create(AOwner: TComponent);
- var i: Integer;
- begin
- inherited Create(AOwner);
- FFileName := '';
- FOffset := 0;
- FSize := 0
- end {Create};
-
- destructor TBFile.Destroy;
- begin
- if FFileName <> '' then Close(FFile);
- inherited Destroy
- end {Destroy};
-
- procedure TBFile.SetFileName(AFileName: TFileName);
- begin
- if FFileName <> '' then
- begin
- FFileName := '';
- FOffset := 0;
- FSize := 0;
- System.Close(FFile)
- end;
- System.Assign(FFile,AFileName);
- try
- FileMode := $42; { read/write, deny-none }
- System.Reset(FFile,1);
- FFileName := AFileName { success! }
- except
- FFileName := ''
- end;
- Offset := 0
- end {SetFileName};
-
- procedure TBFile.SetOffset(AnOffset: LongInt);
- begin
- AnOffset := AnOffset AND NOT BlockLine; { skip lower bits }
- if (AnOffset <> FOffset) or (AnOffset = 0) or (FOffset = 0) then
- begin
- FOffset := AnOffset;
- FillChar(FBlock,SizeOf(FBlock),#0);
- if FFileName <> '' then
- try
- Seek(FFile,FOffset);
- BlockRead(FFile,FBlock,SizeOf(FBlock),FSize);
- except
- FOffset := 0;
- FSize := 0
- end
- else
- begin
- FOffset := 0;
- FSize := 0
- end
- end
- end {SetOffset};
-
- procedure Register;
- begin
- RegisterComponents('Dr.Bob',[TBFile])
- end;
- end.
-